#ifndef ARBOL_H
#define ARBOL_H

#include "Iterable.h"

template <class T>
class Arbol abstract : public Iterable<T>
{
public:

	virtual ~Arbol() { }

	//pos: inserta x en el arbol
	virtual void Insertar(const T &x) abstract;

	
	//pos: retorna true si el arbol es vacio
	virtual bool EsVacio() const abstract; 

	//pre: el arbol no es vacio
    //pos: retorna la raiz del arbol
	virtual const T& Raiz() const abstract;
	
	//pre: el arbol no es vacio
    //pos: retorna el maximo elemento del arbol
	virtual const T& Maximo() const abstract;

	//pre: el arbol no es vacio
    //pos: retorna el minimo elemento del arbol
	virtual const T& Minimo() const abstract;

	//pos: retorna true si el elemento x esta en el arbol
	virtual bool Existe(const T &x) const abstract; 

	//pos: borra x del arbol en caso de que este
	virtual void Borrar(const T &x) abstract;

	//pos: borra todo el arbol en caso de que no este vacio
	virtual void BorrarTodo() abstract;

	//pre: x existe en el arbol
 	//pos: recupera x y lo retorna
	virtual const T& Recuperar(const T&) const abstract;

	//pos:retorno el iterador
	virtual Iterador<T> ObtenerIterador() const abstract;

	// Devuelve un nuevo arbol que es una copia de la actual
	// Los elementos que pertenecen a ambos arboles son los mismos
	// pero los nodos de los arboles no deben compartir memoria
	virtual Puntero<Arbol<T>> Clonar() const abstract;
};

#endif